package juego;
import java.util.ArrayList;
import java.util.Iterator;

public abstract class Vehiculo extends Automata {
	
	//Atributos de instancia
	protected boolean esGuia;
	protected boolean huyendo;
	protected Energia resistencia;
	
	
	//Metodos
	
	//Constructor. recibe una coordenada y un entero
	public Vehiculo(Coordenada coordenada, int vida){
		super(coordenada);
		this.esGuia = false;
		this.huyendo = false;
		this.resistencia = new Energia(vida);
	};
	
	//Transforma al vehiculo en guia
	public void designarGuia(){
		esGuia = true;
	};
	
	public void emprenderHuida(){
		huyendo = true;
	};
	
	@Override
	public boolean esNaveEnemiga(){
		return true;
	};
	
	@Override
	public boolean esProyectil(){
		return false;
	};
	
	protected abstract int puntajePorDestruccion();
	
	protected abstract int velocidad();
	
	//Mueve el vehiculo hacia arriba
	protected void huir(){
		ubicacion.moverEnY(this.velocidad());
	};
	
	//Le indica a todas las naves que deben huir
	protected void provocarHuida(ArrayList<Movil> listaDeObjetos){
		
		Iterator<Movil> iterador = listaDeObjetos.iterator();
		while (iterador.hasNext()){
			Movil movil = iterador.next();
			if (movil.esNaveEnemiga()){
				
				//lo casteo
				Vehiculo nave = (Vehiculo) movil;
				nave.emprenderHuida();
			};
		};
	};
	
	@Override
	public int recibirImpacto(Impacto impacto, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		
		impacto.herir(this.resistencia);
		
		if (resistencia.quedaEnergia()){
			return 0;
		}
		else {
			this.vivo = false;
			if (this.esGuia){
				this.provocarHuida(listaDeMoviles);
			}
			return this.puntajePorDestruccion();}
		};
		
		
	//Lo primero que hace el vehiculo es moverse. Luego verifica si fue impactado,
	//y actua en consecuencia.	
	@Override
	public int vivir(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		
		int puntaje = 0;
		//movimiento
		if (this.huyendo){
			this.huir();
		}
		else{
			this.movimientoPropio();
		};
		
		//impacto
		puntaje = this.impactar(listaDeMoviles,listaDeBotines);
		return puntaje;
	};
	
	
	//Retorna el puntaje acumulado por la destruccion de otros moviles.
	//Este metodo se encarga de llamar al metodo destruirse.
	@Override
	protected int impactar(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		
		int puntaje = 0;
		Iterator<Movil> iterador = listaDeMoviles.iterator();
		boolean contacto;
				
		while (iterador.hasNext()){
			
			Movil movil = iterador.next();
			try {
				contacto = movil.huboContacto(this);
				
				//solo puede ser impactado por el algo42 o proyectiles de este
				if (contacto & movil.verLealtad()){
					
					//recibe el impacto
					movil.impactoProvocado().herir(this.resistencia);
										
					//provoca el impacto
					movil.recibirImpacto(this.impactoProvocado(), listaDeMoviles, listaDeBotines);
					
					//si no esta vivo lo elimina de la lista
					if (!movil.estaVivo()){
						iterador.remove();
					};
				}
			}
			catch (Exception e){}
		}
		
		if (!this.resistencia.quedaEnergia()){
			this.destruirse(listaDeMoviles);
			puntaje = this.puntajePorDestruccion();
			if (this.esGuia){
				this.provocarHuida(listaDeMoviles);
			}
		}
		
		return puntaje;
	};
	
	

}



